package aussortiert;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;

import javax.swing.ButtonGroup;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTextField;

import controller.BerichtsheftController;
import data.Settings;

public class CopyOfSettingsDialog {

	protected JDialog dialog;
	private ButtonHandler buttonHandler;
	private JButton buttonSpeichern, buttonFachHinzufügen, buttonFachEntfernen;
	
	private JLabel labelTopText;
	private JLabel labelFacheingabe;
	
	private JTextField textboxFacheingabe;
	private JList<String> listFächer;
	
	private JRadioButton radiobuttonBlockweise;
	private JRadioButton radiobuttonWöchentlich;
	
	private JCheckBox[] checkboxWochentage;
	
	private JCheckBox checkboxReminder;
	
	private BerichtsheftController bhc;
	private Settings settings;
	
	public CopyOfSettingsDialog(BerichtsheftController bhc, Settings settings){
		this.bhc = bhc;
		this.settings = settings;
		
		buttonHandler = new ButtonHandler();
		dialog = new JDialog();
		dialog.setTitle("Einstellungen");
		dialog.setSize(600, 350);
		dialog.setResizable(false);
		dialog.setMinimumSize(dialog.getSize());
		dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); // TODO
		dialog.setLocationRelativeTo(null);
		dialog.setModal(true);
		dialog.setLayout(null);
		setupGUI();
		dialog.setVisible(true);
		
		refreshFachListe();
	}
	
	// TODO sofern Boolean Wert true, Überladung d.h. Settings wird als Menüpunkt aufgerufen und kriegt andere Eigenschafen als der Anfangssettingsdialog
	public CopyOfSettingsDialog(BerichtsheftController bhc, Settings settings, boolean b) {
		// SettingsDialog s = new SettingsDialog(bhc,settings);
		this(bhc, settings);
		dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); // TODO fixen (label wird nciht mehr richtig gesetzt, kommt von jdialog änderung!!!)
		labelTopText.setText("Einstellungen editieren");
		textboxFacheingabe.setText(null);
		
	}

	private void setupGUI(){
		
		labelTopText = new JLabel();
		labelTopText.setText("<html><body>Herzlich Willkommen zum Berichtshefteditor 3000!<br><br>Bitte nimm dir einen Moment Zeit, und wähle die gewünschten Einstellungen, die auf dich zutreffen.<br>Beachte dabei, dass es bisher nicht vorgesehen ist, diese im Nachhinein zu ändern.</body></html>");
		labelTopText.setBounds(20, 15, 600, 75);
		dialog.add(labelTopText);
		
		ButtonGroup berufsschulZeiten = new ButtonGroup();
		radiobuttonBlockweise = new JRadioButton("Blockunterricht");
		radiobuttonWöchentlich = new JRadioButton("Wöchentlicher Unterricht");
		
		
		
		checkboxWochentage = new JCheckBox[5];
		String[] wochentagslabel = {"Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag"};
		
		
		for(int i = 0; i<checkboxWochentage.length; i++){
			checkboxWochentage[i] = new JCheckBox(wochentagslabel[i]);
		}
		
		textboxFacheingabe = new JTextField();
		
		buttonFachHinzufügen = new JButton("→");
		buttonFachHinzufügen.addActionListener(buttonHandler);
		
		buttonFachEntfernen = new JButton("←");
		buttonFachEntfernen.addActionListener(buttonHandler);
		
		buttonSpeichern = new JButton("Speichern");
		buttonSpeichern.addActionListener(buttonHandler);
		 
		listFächer = new JList<String>(new DefaultListModel<String>());
		
		berufsschulZeiten.add(radiobuttonBlockweise);
		berufsschulZeiten.add(radiobuttonWöchentlich);
		
		radiobuttonBlockweise.setBounds(20, 100, 150, 20);
		radiobuttonWöchentlich.setBounds(20, 120, 175, 20);
		
		dialog.add(radiobuttonBlockweise);
		dialog.add(radiobuttonWöchentlich);
		//vorauswahl blockweise
		radiobuttonBlockweise.setSelected(true);
		
		int iY = 150;
		
		
		labelFacheingabe = new JLabel("<html><body align=\"right\">Berufsschulfächer<br>eingeben</body></html>");
		labelFacheingabe.setBounds(250, 130, 120, 30);
		dialog.add(labelFacheingabe);
		
		textboxFacheingabe.setBounds(220, 100, 100, 25);
		dialog.add(textboxFacheingabe);
		textboxFacheingabe.addKeyListener(new KeyListener(){
			/*
			 * KeyListener für Enter drücken in facheingabe feld
			 * 
			 * (non-Javadoc)
			 * @see java.awt.event.KeyListener#keyPressed(java.awt.event.KeyEvent)
			 */
			@Override
			public void keyPressed(KeyEvent ke) {
				if(ke.getKeyCode() ==KeyEvent.VK_ENTER) {
					buttonFachHinzufügen.doClick();
				}
			}
			public void keyReleased(KeyEvent ke) {}
			public void keyTyped(KeyEvent ke) {}
		});
		
		buttonFachHinzufügen.setBounds(320, 100, 50, 25);
		buttonFachHinzufügen.setFocusPainted(false);
		
		buttonFachEntfernen.setBounds(320, 160, 50, 25);
		buttonFachEntfernen.setFocusPainted(false);
		
		dialog.add(buttonFachHinzufügen);
		dialog.add(buttonFachEntfernen);
//		fachliste.setBounds(250, 300, 150, 150);
//		fachliste.setBorder(BorderFactory.createEtchedBorder());
		JScrollPane jsp = new JScrollPane(listFächer, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
		jsp.setBounds(370, 100, 150, 150);
		dialog.add(jsp);
		
		buttonSpeichern.setBounds(250, 270, 250, 25);
		buttonSpeichern.setFocusPainted(false);
		dialog.add(buttonSpeichern);
		
		ArrayList<String> set = settings.getFachListe();
		if(!set.isEmpty() )
		{
			for( String fach : set )
			{
				textboxFacheingabe.setText(fach);
			}

		}
		
		if(!settings.isBlockunterricht())
		{
			radiobuttonWöchentlich.setSelected(true);
			
			 for (int i = 0; i < settings.unterrichtsTage.length; i++)
			 {
				if(settings.unterrichtsTage[i] == true)
				{
					checkboxWochentage[i].setSelected(true);
				}
			}
		}
		else {
			for (JCheckBox blackBox : checkboxWochentage)
		    {
				blackBox.setVisible(false);
			}
		}
		
		CheckListener cl = new CheckListener();
		
		for(int i = 0; i < checkboxWochentage.length; i++){
			checkboxWochentage[i].addItemListener(cl);
			checkboxWochentage[i].setBounds(25, iY+i*25, 150, 20);
			dialog.add(checkboxWochentage[i]);
		}
		
		RadioListener il = new RadioListener();
		
		radiobuttonBlockweise.addItemListener(il);
		radiobuttonWöchentlich.addItemListener(il);
		
		
		checkboxReminder = new JCheckBox("Tägliche Erinnerung");
		checkboxReminder.setBounds(15, 290, 160, 20);
		dialog.add(checkboxReminder);
		
	}
	
	private void refreshFachListe() {
		DefaultListModel<String> dlm= new DefaultListModel<String>();
		for(int i = 0; i < settings.getFachListe().size(); i++) {
			dlm.addElement(settings.getFachListe().get(i));
		}
		listFächer.setModel(dlm);
	}

	
	class RadioListener implements ItemListener {
		@Override
		public void itemStateChanged(ItemEvent e) {
			JRadioButton source = (JRadioButton)e.getSource();
			
		    if(source.getText().equals("Blockunterricht"))
		    { 
		       settings.setBlockunterricht(true);
		      
		    }
		    
		    else {
    	   		settings.setBlockunterricht(false);
    	   		
       		}
		    for (JCheckBox blackBox : checkboxWochentage)
		    {
				blackBox.setVisible(!settings.isBlockunterricht());
			}
		   

		}
	}
	
	class CheckListener implements ItemListener {
		@Override
		public void itemStateChanged(ItemEvent e) {
			for(int i = 0; i < checkboxWochentage.length; i++) {
				settings.setUnterrichtstag(i, checkboxWochentage[i].isSelected());
			}
		}
	}
	
	class ButtonHandler implements ActionListener {
		@Override
		public void actionPerformed(ActionEvent event) {
			JComponent source = (JComponent) event.getSource();

			if (source == buttonFachHinzufügen){
				if(!"".equals(textboxFacheingabe.getText())) {
					if (textboxFacheingabe.getText().contains(";")) {
						JOptionPane.showMessageDialog(null,"Bitte verwende keine Semikolons für die Fachbezeichnungen.", "Semikolon reserviert", JOptionPane.ERROR_MESSAGE);
					} else {
						settings.addFach(textboxFacheingabe.getText());
						refreshFachListe();
						textboxFacheingabe.setText(null);
						textboxFacheingabe.requestFocus();
					}
				}
			}
			
			if (source == buttonFachEntfernen){
				        settings.deleteFach(listFächer.getSelectedValue());
					    refreshFachListe();
					    textboxFacheingabe.setText(null);
						textboxFacheingabe.requestFocus();
					    
															
			}
			
			if (source == buttonSpeichern) {
//				System.out.println(settings.generateIniFileString());
				
				while (bhc.writeSettingsFile() == true) { // TODO was tut das hier?
					
				}
				bhc.writeSettingsFile();
					
			}
			
		}
	}
	
}
